package com.niit.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.Date;

@Data                     // 自动生成private修饰的属性的Getter和Setter方法
@NoArgsConstructor        // 自动生成无参构造器
@AllArgsConstructor       // 自动生成有参构造器
@ToString                 // 相当于重写了toString,在查看log的时候可以清楚看到用户可以识别的信息，不至于都是hashCode
@Accessors(chain = true)  // 使用 Lombok 中的 @Accessors(chain = true) 注解，能让我们方便使用链式方法创建实体对象。
@Document(value = "User") // 指定当前对象与mongdb中的表的映射关系
public class User {
    @JsonIgnore
    private String _id;      // _id是mongodb默认自动生成的，User对象在转成json字符串时忽略此字段
    private Integer userId;  //userId是用户名username的hashCode值，用于在用户给商品打分时将其写入日志文件中
    private String username; // 用户名
    private String password; // 密码
    @JsonFormat( pattern ="yyyy-MM-dd HH:mm:SS", timezone ="GMT+8")
    private Date createTime = new Date();
    @JsonFormat( pattern ="yyyy-MM-dd HH:mm:SS", timezone ="GMT+8")
    private Date updateTime;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        // int型的值取值范围为Integer.MIN_VALUE(-2147483648)～Integer.MAX_VALUE(2147483647)
        // hashCode可能会有负数产生。如何让负数变成正数，并且保证在整数的范围内不溢出呢？
        // 有一种牛逼的办法就是使用位与操作：强制把符号位去掉，保证结果只在正数区间
        this.userId = username.hashCode() & Integer.MAX_VALUE; // caution, make value not minus
        this.username = username;
    }
}
